#include <cstdio>
using namespace std;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=(x<<1)+(x<<3)+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int P=998244353,N=100003,Iv=166374059;
typedef long long ll;
int n,a[N];
int F1(int x){return ((ll)x*(x+1)>>1)%P;}
int F2(int x){
	int res=((ll)F1(x)*x%P-(ll)x*(x+1)%P*((ll)x+x+1)%P*Iv%P)%P;
	if(res<0) return res+P;
	return res;
}
int f[N][4][2],g[N][4],h[N][4];
void inc(int &x,int v){if((x+=v)>=P) x-=P;}
void dec(int &x,int v){if((x-=v)<0) x+=P;}
int rundp(int s){
	for(int t=0;t<4;++t) f[1][t][0]=f[1][t][1]=0;
	f[1][s][0]=g[1][s];
	f[1][s][1]=h[1][s];
	for(int i=2;i<=n;++i)
		for(int x=0;x<4;++x){
			int t0=0,t1=0;
			for(int y=0;y<4;++y){
				if((x&1)==(y>>1&1)) continue;
				inc(t0,f[i-1][y][0]);
				inc(t1,f[i-1][y][1]);
			}
			f[i][x][0]=(ll)t0*g[i][x]%P;
			f[i][x][1]=((ll)t1*(g[i][x]+h[i][x])%P+(ll)t0*h[i][x]%P)%P;
		}
	int res=0;
	for(int x=0;x<4;++x){
		if((s&1)==(x>>1&1)) continue;
		inc(res,f[n][x][1]);
	}
	return res;
}
int main(){
	freopen("trade.in","r",stdin);
	freopen("trade.out","w",stdout);
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	for(int i=1;i<=n;++i){
		g[i][0]=a[i]+1;
		g[i][1]=g[i][2]=F1(a[i]%P);
		g[i][3]=F2(a[i]%P);
		h[i][0]=1;
		h[i][1]=a[i];
		h[i][2]=h[i][3]=0;
		for(int t=0;t<4;++t) dec(g[i][t],h[i][t]);
	}
	int res=0;
	for(int t=0;t<4;++t) inc(res,rundp(t));
	while(res<0) res+=P;
	printf("%d\n",res);
	return 0;
}
